package com.dylan.shot.head;

import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Created by Dylan on 2017/9/4.
 */
@SpringBootApplication
//@EnableConfigurationProperties(WechatSettings.class) // 该注解用来配创建配置类对象,可以在配置类使用@Configuration代替
@ComponentScan("com.dylan.shot")
public class ShotHeadApplication {

    /* 依赖model的配置文件名,不需要加".properties",会自动在类路径下加载 */
    private static List<String> dependentConfigurationNameList = new ArrayList<>();
    static {
        dependentConfigurationNameList.add("application"); // 默认的
        dependentConfigurationNameList.add("shot_common"); // 其他model的
    }

    /**
     * 将不同model的配置拆分到model下面的配置文件中,由于同一classpath不能同时出现两个application.properties,所以只能使用不同配置文件名的方式,
     * 然后通过修改启动参数来完成依赖model的配置文件加载,下面是使用方法
     * 启动时,可以使用参数 --spring.profiles.active=test 来设置启动环境
     * 通过 --spring.config.name=application,shot_common 来设置依赖的配置文件名
     * 例如:
     * java -jar shot-head.jar --spring.profiles.active=test --spring.config.name=application,shot_common
     * 此配置直接在main方法中添加,不使用命令行的方式
     *
     * 如果有外部配置文件,例如数据库单独的配置文件,可以使用 --spring.config.location 在命令行中来指定
     */
    public static void main(String[] args) {
        // 配置 spring.config.name 变量,指定配置文件名.如果不想拆分配置文件,则去掉下面的代码
        args = argsAppend(args, "--spring.config.name=" + StringUtils.join(dependentConfigurationNameList, ","));
        System.out.println("启动参数: " + Arrays.toString(args));
        SpringApplication app = new SpringApplication(ShotHeadApplication.class);
        app.setBannerMode(Banner.Mode.OFF); // 关闭banner
        app.run(args);
    }

    private static String[] argsAppend(String[] args, String appended) {
        String[] args2 = new String[args.length + 1];
        System.arraycopy(args, 0, args2, 0, args.length);
        args2[args2.length - 1] = appended;
        return args2;
    }

}
